/*
bitset函数是将十进制转换为二进制，就不用自己再手写了，比较方便
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
//1.无参构造，长度为3，默认每一位为0
    bitset<3> bitset1;  //000
    
//2. 长度为8，11转二进制后，前面补0补
    bitset<8> bitset2(11);//00001011

//3.长度为8，前面补0
    string s1 = "1011"; // 或char s2[] = "1011";
    bitset<8> bitset3(s1);//00001011

/*
注意

用字符串构造，字符串只能包含 ‘0’ 或 ‘1’
要在<>中表明bitset 的size
有参构造时，
(1) 参数的二进制长度 小于 bitset的size ——> 前面补０；
(2) 参数的二进制长度 大于 bitset的size ——> 参数为整数 ——>取后面
                                    ——> 参数为字符串 ——>取前面
(3)bitset<5>:破折号里面必须写一个常量，就是一个具体的数，不可以是一个变量
*/

//单纯的bitset函数是将十进制转二进制，但也可以二进制转十进制
    string s2("00000111");
    bitset<8> b(s2);
    //转化为数字
    cout<<b.to_ulong()<<endl;//7

    //转化为字符串
    string x=b.to_string();
    cout<<x<<endl;

//使用字符串的一个子串来赋初值
    string str="111111100000001110";
    bitset<32> b(str,5,4);//从str[5]开始的四位二进制，1100
    bitset<32> b(str,str.size()-4);//使用最后四个字符
}

/*
bitset操作

b.any           b中是否存在置为1的二进制位？

b.none()        b中不存在置为1的二进制位吗？

b.count()       b中置为1的二进制位的个数

b.size()        b中二进制位的个数

b[pos]          访问b中在pos处的二进制位

b.test(pos)     b中在pos处的二进制位是否为1？

b.set()         把b中所有二进制位都置为1

b.set(pos)      把b中在pos处的二进制位置为1

b.reset()       把b中所有二进制位都置为0

b.reset(pos)    把b中在pos处的二进制位置为0

b.flip()        把b中所有二进制位逐位取反

b.flip(pos)     把b中在pos处的二进制位取反

b.to_ulong()    用b中同样的二进制位返回一个unsigned long值

os << b         把b中的位集输出到os流
*/
/*
可以通过位置来访问bitset中的二进制位。例如，bitvec包含编号从0到31的32个二进制位。
编号从0开始的二进制位被称为低位(low-order),编号到31结束的二进制位被称为高位(high-order)

00001011
cout<<b[0]<<" "<<b[1]<<" "<<b[2]<<" "<<b[3]<<endl;
//1 1 0 1
b[0]是从右边开始数，第一位下标为0
*/